package cn.topevery.garden.dal.logic;

import cn.hutool.core.bean.BeanUtil;
import cn.topevery.garden.dal.dao.PersonDao;
import cn.topevery.garden.entity.po.Person;
import cn.topevery.garden.entity.po.PersonSearch;
import cn.topevery.garden.entity.query.PersonQuery;
import cn.topevery.garden.entity.vo.PersonVO;
import cn.topevery.garden.entity.vo.oneMap.CountVO;
import cn.topevery.garden.framework.base.BaseLogic;
import hw.topevery.basis.entity.po.SysUser;
import hw.topevery.framework.db.base.BaseEntityDao;
import hw.topevery.framework.db.entity.DataPager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author code-generate
 * @date 2021-08-06
 */
@Service
public class PersonLogic extends BaseLogic<Person> {
    @Autowired
    PersonDao personDao;

    @Override
    public BaseEntityDao<Person, Integer> getDao() {
        return personDao;
    }


    /**
     * 获取列表
     *
     * @param query
     */
    public DataPager<PersonSearch> listPage(PersonQuery query) {
        //首先更新t_sys_user表中有，而t_sys_person中没有的数据，应为pmi新增的用户不会自动同步到业务表中
        List<SysUser> userNotIn = personDao.getUserNotIn();
        if (!CollectionUtils.isEmpty(userNotIn)) {
            List<Person> addList = userNotIn.stream().map(u -> {
                Person person = BeanUtil.copyProperties(u, Person.class);
                person.setWorkState(2);
                person.setWorkStateDesc("在用");
                person.setName(u.userName);
                person.setUserId(u.userId);
                return person;
            }).collect(Collectors.toList());
            personDao.insert("10", addList);
        }
        return personDao.listPage(query);
    }

    /**
     * 根据自增id批量删除
     *
     * @param ids
     */
    public void deleteBatchById(String userId, Integer[] ids) {
        personDao.delete(userId, ids);
    }

    public void saveOrUpdate(String userId, Person person) {
        personDao.saveOrUpdate(userId, person);
    }

    /**
     * 描述 获取统计数量.
     *
     * @param name     the name
     * @param extentId the extent id
     * @return the list
     * @author wenzhao.lin
     * @created 2021 -08-25 09:26:38 Get count list.
     */
    public Map getCount(String name, Integer extentId, Integer typeId) {
        return personDao.getCount(name, extentId, typeId);
    }

    /**
     * 描述 通过人员类型获取列表
     *
     * @param name       the name
     * @param extentId   the extent id
     * @param personType the person type
     * @return the person list by type
     * @author wenzhao.lin
     * @created 2021 -08-25 09:26:38
     */
    public List<Person> getPersonListByType(String name, Integer extentId, Integer personType) {
        return personDao.getPersonListByType(name, extentId, personType);
    }

    /**
     * 描述 获取类型列表
     *
     * @param name     the name
     * @param extentId the extent id
     * @return the person type list
     * @author wenzhao.lin
     * @created 2021 -08-27 09:16:21
     */
    public List<Person> getPersonTypeList(String name, Integer extentId) {
        return personDao.getPersonTypeList(name, extentId);
    }

    public List<SysUser> getSysUserList(List<String> mobiles) {
        return personDao.getSysUserList(mobiles);
    }

    public List<Person> getPesonList(List<String> mobiles) {
        return personDao.getPesonList(mobiles);
    }

    /**
     * 描述 一张图管理-人车概况- 获取人员统计
     *
     * @return the person count
     * @author wenzhao.lin
     * @created 2021 -09-09 13:58:05
     */
    public List<CountVO> getPersonCount() {
        return personDao.getPersonCount();
    }

    /**
     * 描述 一张图管理-人车概况- 获取人员 在线/离线 统计
     *
     * @return the person online count
     * @author wenzhao.lin
     * @created 2021 -09-13 09:19:32
     */
    public List<CountVO> getPersonOnlineAndOutCount() {
        return personDao.getPersonOnlineAndOutCount();
    }


    /**
     * 描述 一张图管理-人车概况- 获取所有人员类型统计
     *
     * @return the person type count
     * @author wenzhao.lin
     * @created 2021 -09-09 13:58:05
     */
    public List<CountVO> getPersonTypeCount() {
        return personDao.getPersonTypeCount();
    }

    /**
     * 描述 一张图管理-人车概况- 获取在岗人员类型统计
     *
     * @return the person online count
     * @author wenzhao.lin
     * @created 2021 -09-09 13:58:05
     */
    public List<CountVO> getPersonOnlineCount() {
        return personDao.getPersonOnlineCount();
    }

    /**
     * 描述 一张图管理-人车概况- 获取人员列表
     *
     * @param query the query
     * @return the data pager
     * @author wenzhao.lin
     * @created 2021 -09-09 13:47:26 List page data pager.
     */
    public DataPager<PersonVO> getPersonListData(PersonQuery query) {
        return personDao.getPersonListData(query);
    }

    public PersonVO getByUserId(String userId) {
        return personDao.getByUserId(userId);
    }

    public List<Map<String, Object>> getOpenIdByExtentId(Integer extentId) {
        return personDao.getOpenIdByExtentId(extentId);
    }
}
